(function($){ 
	/**
	 * 还原表单数据，传递JSON数据
	 */
	$.fn.restoreData = function(data){
		var formInput = $(this).find('*');
		formInput.each(function() {
			var name = $(this).attr('name');
			var value = data[name];
			var tagName = $(this)[0].tagName;
			var type = $(this).attr('type');
			if (tagName.toLowerCase() == 'input') {
				if (type == 'radio') {
					$(this).prop('checked', $(this).val() == value);
				} else if (type == 'checkbox') {
					var arr = value;
					
					if (typeof value == 'string') {
						arr = value.split(',');
					}else if(typeof value == 'object'){
						for (var i = 0; i < arr.length; i++) {
							if ($(this).val() == arr[i]) {
								// 具有 true 和 false 两个属性的属性，如 checked, selected
								// 或者 disabled 使用prop()，其他的使用 attr()
								$(this).prop('checked', true);
								break;
							}
						}						
					}
				} else {
					$(this).val(value);
				}
			} else if (tagName.toLowerCase() == 'select' || tagName.toLowerCase() == 'textarea') {
				$(this).val(value);
			}
		})
	};
	
	/**
	 * 组装页面的数据，转换成JSON格式
	 */
	$.fn.toJson = function(){
		var formInput = $(this).find('*');
		
		var array = {};
		formInput.each(function() {
			var name = $(this).attr('name');
			var tagName = $(this)[0].tagName;
			var type = $(this).attr('type');
			if (tagName.toLowerCase() == 'input') {
				if (type == 'radio') {
					array[name] = $(this).val();
				} else if (type == 'checkbox') {
					if($(this).prop("checked")){
						if(name in array){
							array[name].push($(this).val());
						}else{
							var arr = [];
							arr.push($(this).val());
							array[name] = arr;
						}
					}
				} else {
					array[name] = $(this).val();
				}
			} else if (tagName.toLowerCase() == 'select' || tagName.toLowerCase() == 'textarea') {
				array[name] = $(this).val();
			}
		});
		return JSON.stringify(array);
	};
	
})(jQuery);

jQuery.extend({
		/**
		 * $.postJsonAjax 使用于post JSON数据到spring controll
		 * 
		 * options 写法与 $.ajax一致
		 */
		postJsonAjax:function (options){
			options.type = 'POST';
			options.contentType = 'application/json;charset=utf-8';
			if("object" == typeof options.data){
				// 后台要用@requestBody注解接收
				options.data = JSON.stringify(options.data);
			}
			$.ajax(options);
		},
		/**
		 * $.getQueryString() 获取url参数,name为参数名称
		 */
		getQueryString:function(name){
			var reg = new RegExp("(^|&)"+name+"=([^&]*)(&|$)");  
			var r= window.location.search.substr(1).match(reg);  
			if (r!=null){
				return unescape(r[2]);
			}
			return "";  
		},
		/**
		 * $.fetchProtocol() 获取请求地址使用的协议
		 */
		fetchProtocol:function(){
			return window.location.protocol;
		},
		/**
		 * $.fetchBaseUrl() 获取请求地址基本路径，不包含上下文
		 */		
		fetchBaseUrl:function(){
			return this.fetchProtocol()+"//"+window.location.host;
		},
		/**
		 * $.fetchContext() 获取请求地址上下文
		 */			
		fetchContext:function(){
			var contextPath = window.location.pathname;
			contextPath = contextPath.substring(0,
					contextPath.substr(1).indexOf('/') + 1);
			return this.fetchBaseUrl()+contextPath;
		}
});	

/**
 * 对Date的扩展，将 Date 转化为指定格式的String
 * 
 * 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符，
 * 
 * 年(y)可以用 1-4 个占位符，毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
 * 
 * 如 var time=(new Date()).format("yyyy-MM-dd hh:mm:ss.S")==>2006-07-02
 * 08:09:04.423
 * 
 * author: meizz
 */
Date.prototype.format = function(fmt){
  var o = {   
    "M+" : this.getMonth()+1,                 // 月份
    "d+" : this.getDate(),                    // 日
    "h+" : this.getHours(),                   // 小时
    "m+" : this.getMinutes(),                 // 分
    "s+" : this.getSeconds(),                 // 秒
    "q+" : Math.floor((this.getMonth()+3)/3), // 季度
    "S"  : this.getMilliseconds()             // 毫秒
  };   
  
  if(/(y+)/.test(fmt)){
	 fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));
  } 
   
  for(var k in o){
	 if(new RegExp("("+ k +")").test(fmt)){
		 fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
	 }
  }  
  return fmt;   
}

/**
 * 对Date的扩展，将 String 转化为 Date
 * 
 * 如
 * 
 * var today = "2016-10-11";
 * 
 * today.toDate();
 */ 
String.prototype.toDate = function (){
	var converted = Date.parse(this);
	var myDate = new Date(converted);
	if (isNaN(myDate)){
		// var delimCahar = date.indexOf('/')!=-1?'/':'-';
		var arys= date.split('-');
		myDate = new Date(arys[0],--arys[1],arys[2]);
	}
	return myDate;
} 
